package ar.com.larreta.utilidades;

import java.util.HashMap;
import java.util.Map;

public class NumeroLetra {

	private int flag;
	public int numero;
	public String importe_parcial;
	public String num;
	public String num_letra;
	public String num_letram;
	public String num_letradm;
	public String num_letracm;
	public String num_letramm;
	public String num_letradmm;
	
	public Map<Integer, String> unidades;
	public Map<Integer, String> decenas;
	public Map<Integer, String> decenaEspecial;
	public Map<Integer, String> centenas;
	
	public NumeroLetra(){
		numero = 0;
		flag=0;
		inicializar();
	}
	public NumeroLetra(int n){
		numero = n;
		flag=0;
		inicializar();
	}
	
	public void inicializar(){
		inicializarUnidades();
		inicializarDecenas();
		inicializarDecenaEspecial();
		inicializarCentenas();
	}
	
	public void inicializarUnidades(){
		unidades = new HashMap<Integer, String>();
		unidades.put(0, "");
		unidades.put(1, "uno");
		unidades.put(2, "dos");
		unidades.put(3, "tres");
		unidades.put(4, "cuatro");
		unidades.put(5, "cinco");
		unidades.put(6, "seis");
		unidades.put(7, "siete");
		unidades.put(8, "ocho");
		unidades.put(9, "nueve");
	}
	
	public void inicializarDecenas(){
		decenas = new HashMap<Integer, String>();
		decenas.put(2, "veinti");
		decenas.put(3, "treinta ");
		decenas.put(4, "cuarenta ");
		decenas.put(5, "cincuenta ");
		decenas.put(6, "sesenta ");
		decenas.put(7, "setenta ");
		decenas.put(8, "ochenta ");
		decenas.put(9, "noventa ");
	}

	public void inicializarDecenaEspecial(){
		decenaEspecial = new HashMap<Integer, String>();
		decenaEspecial.put(10, "diez ");
		decenaEspecial.put(11, "once ");
		decenaEspecial.put(12, "doce ");
		decenaEspecial.put(13, "trece ");
		decenaEspecial.put(14, "catorce ");
		decenaEspecial.put(15, "quince ");
		decenaEspecial.put(16, "dieciseis ");
		decenaEspecial.put(17, "diecisiete ");
		decenaEspecial.put(18, "dieciocho ");
		decenaEspecial.put(19, "diecinueve ");
	}

	public void inicializarCentenas(){
		centenas = new HashMap<Integer, String>();
		centenas.put(0, "");
		centenas.put(1, "ciento ");
		centenas.put(2, "doscientos ");
		centenas.put(3, "trescientos ");
		centenas.put(4, "cuatrocientos ");
		centenas.put(5, "quinientos ");
		centenas.put(6, "seiscientos ");
		centenas.put(7, "setecientos ");
		centenas.put(8, "ochocientos ");
		centenas.put(9, "novecientos ");
	}

	
	private String unidad(int numero){
		if ((numero==1) && (flag!=0)){
			return "un";
		} else {
			return unidades.get(numero);
		}
	}
	
	private String decena(int numero){
		Integer decena = numero / 10;
		Integer unidad = numero - (decena*10);
		
		if (numero < 10){
			return unidad(numero);
		} else if (numero < 20){
			return decenaEspecial.get(numero);
		} else if (numero == 20) {
			return "veinte";
		} else if (numero < 30){
			return decenas.get(decena) + unidades.get(unidad);
		} else {
			StringBuffer buff = new StringBuffer(); 
			buff.append(decenas.get(decena));
			if (unidad>0){
				buff.append("y ");
				buff.append(unidades.get(unidad));
			}
			return buff.toString();
		}
	}	

	private String centena(int numero){
		Integer centena = numero / 100;
		Integer decena = numero - (centena*100);
		
		if (numero<100){
			return decena(numero);
		} else if (numero == 100) {
			return "cien ";
		} else {
			StringBuffer buff = new StringBuffer();
			buff.append(centenas.get(centena));
			if (decena>0){
				buff.append(decena(decena));	
			}
			return buff.toString();
		}
	}	

	private String miles(int numero){
		if (numero >= 1000 && numero <2000){
			num_letram = ("mil ").concat(centena(numero%1000));
		}
		if (numero >= 2000 && numero <10000){
			flag=1;
			num_letram = unidad(numero/1000).concat(" mil ").concat(centena(numero%1000));
		}
		if (numero < 1000)
			num_letram = centena(numero);
		
		return num_letram;
	}		

	private String decmiles(int numero){
		if (numero == 10000)
			num_letradm = "diez mil";
		if (numero > 10000 && numero <20000){
			flag=1;
			num_letradm = decena(numero/1000).concat("mil ").concat(centena(numero%1000));		
		}
		if (numero >= 20000 && numero <100000){
			flag=1;
			num_letradm = decena(numero/1000).concat(" mil ").concat(miles(numero%1000));		
		}
		
		
		if (numero < 10000)
			num_letradm = miles(numero);
		
		return num_letradm;
	}		

	private String cienmiles(int numero){
		if (numero == 100000)
			num_letracm = "cien mil";
		if (numero >= 100000 && numero <1000000){
			flag=1;
			num_letracm = centena(numero/1000).concat(" mil ").concat(centena(numero%1000));		
		}
		if (numero < 100000)
			num_letracm = decmiles(numero);
		return num_letracm;
	}		

	private String millon(int numero){
		if (numero >= 1000000 && numero <2000000){
			flag=1;
			num_letramm = ("Un millon ").concat(cienmiles(numero%1000000));
		}
		if (numero >= 2000000 && numero <10000000){
			flag=1;
			num_letramm = unidad(numero/1000000).concat(" millones ").concat(cienmiles(numero%1000000));
		}
		if (numero < 1000000)
			num_letramm = cienmiles(numero);
		
		return num_letramm;
	}		
	
	private String decmillon(int numero){
		if (numero == 10000000)
			num_letradmm = "diez millones";
		if (numero > 10000000 && numero <20000000){
			flag=1;
			num_letradmm = decena(numero/1000000).concat("millones ").concat(cienmiles(numero%1000000));		
		}
		if (numero >= 20000000 && numero <100000000){
			flag=1;
			num_letradmm = decena(numero/1000000).concat(" milllones ").concat(millon(numero%1000000));		
		}
		
		
		if (numero < 10000000)
			num_letradmm = millon(numero);
		
		return num_letradmm;
	}		

	
	public static String convertirLetras(Integer numero){
		NumeroLetra transformador = new NumeroLetra();
		return transformador.decmillon(numero);
	}
	
	public static String convertirLetras(Double numero){
		NumeroLetra transformador = new NumeroLetra();
		Integer parteEntera = numero.intValue();
		Double parteDecimal = (numero - parteEntera) * 100;
		if (parteDecimal>0){
			return transformador.decmillon(parteEntera) + " pesos con " + transformador.decmillon(parteDecimal.intValue()) + "centavos";
		} else {
			return transformador.decmillon(parteEntera) + " pesos";
		}
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		NumeroLetra numeroLetra = new NumeroLetra();
		System.err.println(numeroLetra.convertirLetras(9));
		System.err.println(numeroLetra.convertirLetras(11));
		System.err.println(numeroLetra.convertirLetras(20));
		System.err.println(numeroLetra.convertirLetras(21));
		System.err.println(numeroLetra.convertirLetras(30));
		System.err.println(numeroLetra.convertirLetras(99));
		System.err.println(numeroLetra.convertirLetras(100));
		System.err.println(numeroLetra.convertirLetras(101));
		System.err.println(numeroLetra.convertirLetras(111));
		System.err.println(numeroLetra.convertirLetras(121));
		System.err.println(numeroLetra.convertirLetras(153));
		System.err.println(numeroLetra.convertirLetras(1535));
		System.err.println(numeroLetra.convertirLetras(2000));

	}

	
}



